
#include "Felix.h"
#include "defines.h"

using namespace std;

//Metodos de la clase.
//Constructor que envía por parámetro a la clase heredada.
Felix::Felix(short int id,
			 unsigned short int idImagen,
			 int posX, int posY, int alto, int ancho,
			 unsigned char tipo,
			 bool vivo,
			 short int vidas,
			 short int posVidrio,
			 int puntos) : Elemento(id,idImagen, posX, posY, alto, ancho, tipo, vivo){
	this->posVidrio = posVidrio;
	this->vidas 	= vidas;
	this->puntos 	= puntos;
	this->inmune	= false;
}

//Destructor
Felix::~Felix(){
	free(this);
}

/* Getters */
unsigned short int Felix::getPosVidrio(){
	return this->posVidrio;
}

short int Felix::getVidas(){
	return this->vidas;
}

int Felix::getPuntos(){
	return this->puntos;
}

//Metodo de creacion
unsigned short int Felix::aparecer(){
	//TODO
	return CONST_UNO;
}

//Metodo de destruccion
unsigned short int Felix::desaparecer(){
	//TODO
	return CONST_UNO;
}

//Metodo de reparacion de ventana.
void Felix::reparar(){
	this->puntos += PTOS_REP_VIDRIO;
}

//Metodo de reparacion de ventana.
unsigned short int Felix::consumirTorta(){
	this->inmune = CONST_TRUE;
	return CONST_CERO;
}

//Metodo de reparacion de ventana.
unsigned short int Felix::sumarPuntos(int puntos){
	this->puntos += puntos;
	return CONST_UNO;
}

bool Felix::isInmune(){
	return this->inmune;
}

void Felix::setInmune(bool inmune){
	this->inmune = inmune;
}

void Felix::setPosVidrio(unsigned short int posVidrio){
	this->posVidrio = posVidrio;
}

/* Se mueve el offset indicado para cada eje, y actualiza el vidrio dode esta posicionado */
void Felix::moverse(int offsetX, int offsetY){
	//realizo el movimiento por defecto de la clase
	//Si se puede mover horizontal, se mueve.
	if(this->puedoMovermeHorizontalmente(offsetX)){
	        this->posX = this->posX + offsetX;
	}
	//Si se puede mover vertical, se mueve.
	if(this->puedoMovermeVerticalmente(offsetY)){
		this->posY = this->posY + offsetY;
	}

	//Muevo la posicion en el vidrio tambien, en el sentido del offset.
	if(offsetX > 0)
		this->posVidrio += ANCHO_MOV_VID_X_FEL;
	else if(offsetX < 0)
		this->posVidrio -= ANCHO_MOV_VID_X_FEL;
	else if(offsetY < 0)
		this->posVidrio += ANCHO_MOV_VID_Y_FEL;
	else if(offsetY > 0)
		this->posVidrio -= ANCHO_MOV_VID_Y_FEL;

	//TODO: Ver el sentido si no hay que multiplicar por menos uno el incremento de vidrio
}

/* Metodo para quitarle una vida a felix */
void Felix::restarVida(){
	this->vidas--;

	/* Si se quedo sin vidas lo mato */
	if(this->vidas == CONST_CERO)
		this->vivo = CONST_FALSE;

	/* Ahora lo ubico en las posiciones x,y y de vidrio de inicio de cada uno*/
	if(this->id == CONST_ID_FELIX1){
		this->setPosX(POS_INI_X_FELIX1);
		this->setPosY(POS_INI_Y_FELIX1);
		this->setPosVidrio(POS_INI_VID_FELIX1);
	}else{
		this->setPosX(POS_INI_X_FELIX2);
		this->setPosY(POS_INI_Y_FELIX2);
		this->setPosVidrio(POS_INI_VID_FELIX2);
	}
}
